package opf5.ui;

import java.awt.EventQueue;

import javax.swing.JFrame;

import opf5.entities.calificaciones.CalculadorPromedios;
import opf5.entities.dominio.Jugador;
import opf5.entities.repositorios.RepositorioPartidos;

import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.SwingConstants;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

public class VistaDatosJugador {

	private static VistaDatosJugador instance;
	private JFrame frame;
	private Jugador jugador;
	private OPF5TablaInfracciones tablaInfracciones;
	private JLabel lblNombreJugaodr;
	private JLabel lblHandicapJugador;
	private JLabel lblPromedioUltimoPartidoJugador;
	private JLabel promedioTotalJugador;
	private JLabel fechaNacimientoJugador;
	private JLabel lblPartidosJugadosJugador;
	private RepositorioPartidos respositorioPartidos;

	public static VistaDatosJugador getInstance() {
		if (instance == null) {
			instance = new VistaDatosJugador();
		}
		
		return instance;
	}

	public void setRepositorioPartidos(RepositorioPartidos repositorio) {
		this.respositorioPartidos = repositorio;
	}
	
	/**
	 * @wbp.parser.entryPoint
	 */
	public VistaDatosJugador() {
		
		frame = new JFrame();
		frame.setBounds(800, 100, 362, 482);
		frame.getContentPane().setLayout(null);
		
		JLabel lblJugador = new JLabel("Jugador:");
		lblJugador.setBounds(12, 12, 61, 15);
		frame.getContentPane().add(lblJugador);
		
		lblNombreJugaodr = new JLabel("");
		lblNombreJugaodr.setHorizontalAlignment(SwingConstants.RIGHT);
		lblNombreJugaodr.setBounds(210, 12, 131, 15);
		frame.getContentPane().add(lblNombreJugaodr);
		
		JLabel lbl2 = new JLabel("Handicap:");
		lbl2.setBounds(12, 39, 108, 15);
		frame.getContentPane().add(lbl2);
		
		lblHandicapJugador = new JLabel("");
		lblHandicapJugador.setHorizontalAlignment(SwingConstants.RIGHT);
		lblHandicapJugador.setBounds(297, 39, 44, 15);
		frame.getContentPane().add(lblHandicapJugador);
		
		JLabel lblPromerioDeUltimo = new JLabel("Promerio de ultimo partido:");
		lblPromerioDeUltimo.setBounds(12, 66, 256, 15);
		frame.getContentPane().add(lblPromerioDeUltimo);
		
		lblPromedioUltimoPartidoJugador = new JLabel("");
		lblPromedioUltimoPartidoJugador.setHorizontalAlignment(SwingConstants.RIGHT);
		lblPromedioUltimoPartidoJugador.setBounds(297, 66, 44, 15);
		frame.getContentPane().add(lblPromedioUltimoPartidoJugador);
		
		JLabel lblPromedioTotal = new JLabel("Promedio total:");
		lblPromedioTotal.setBounds(12, 93, 229, 15);
		frame.getContentPane().add(lblPromedioTotal);
		
		promedioTotalJugador = new JLabel("");
		promedioTotalJugador.setHorizontalAlignment(SwingConstants.RIGHT);
		promedioTotalJugador.setBounds(297, 93, 44, 15);
		frame.getContentPane().add(promedioTotalJugador);
		
		JLabel lblFechaDeNacimiento = new JLabel("Fecha de nacimiento:");
		lblFechaDeNacimiento.setBounds(12, 120, 229, 15);
		frame.getContentPane().add(lblFechaDeNacimiento);
		
		fechaNacimientoJugador = new JLabel("");
		fechaNacimientoJugador.setHorizontalAlignment(SwingConstants.RIGHT);
		fechaNacimientoJugador.setBounds(210, 120, 131, 15);
		frame.getContentPane().add(fechaNacimientoJugador);
		
		JLabel lblCantidadDePartidos = new JLabel("Cantidad de partidos jugados:");
		lblCantidadDePartidos.setBounds(12, 147, 256, 15);
		frame.getContentPane().add(lblCantidadDePartidos);
		
		lblPartidosJugadosJugador = new JLabel("");
		lblPartidosJugadosJugador.setHorizontalAlignment(SwingConstants.RIGHT);
		lblPartidosJugadosJugador.setBounds(297, 147, 44, 15);
		frame.getContentPane().add(lblPartidosJugadosJugador);
		
		JLabel lblInfracciones = new JLabel("Infracciones:");
		lblInfracciones.setBounds(12, 174, 144, 15);
		frame.getContentPane().add(lblInfracciones);
		
		tablaInfracciones = new OPF5TablaInfracciones(new String[] {"Fecha", "Motivo"});
		tablaInfracciones.setBounds(12, 201, 328, 194);
		frame.getContentPane().add(tablaInfracciones);
		
		JButton btnVolver = new JButton("Volver");
		btnVolver.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				runVolver();
			}
		});
		btnVolver.setBounds(234, 407, 107, 25);
		frame.getContentPane().add(btnVolver);
	}
	
	protected void runVolver() {
		this.frame.setVisible(false);
	}

	public void initialize(Jugador jugador) {
		this.jugador = jugador;

		cargarDatos();
		
		if (! frame.isVisible()) {
			final VistaDatosJugador window = this;
			EventQueue.invokeLater(new Runnable() {
				public void run() {
					try {
						window.frame.setVisible(true);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
		}
	}

	private void cargarDatos() {
		this.lblNombreJugaodr.setText(jugador.getNombre());
		this.lblHandicapJugador.setText(Integer.toString(jugador.getHandicap()));
		this.lblPartidosJugadosJugador.setText(
				Integer.toString(this.respositorioPartidos.getPartidosJugadosPor(jugador).size()));
		this.tablaInfracciones.cargarInfracciones(jugador.getInfracciones());
		this.fechaNacimientoJugador.setText(jugador.getFechaNac().getFechaString("dd/MM/yyyy"));
		
		this.promedioTotalJugador.setText(Double.toString(CalculadorPromedios.calcularPromedioTotal(jugador)));
		this.lblPromedioUltimoPartidoJugador.setText(Double.toString(
				CalculadorPromedios.calcularPromedioUltimoPartido(jugador)));
		
	}

	public void ocultar() {
		this.frame.setVisible(false);
	}
}
